Supplement 6. Systematic review

PRISMA flowchart

PRISMAstatement::prisma(found = 8002,
       found_other = 7,
       no_dupes = 7187, 
       screened = 7187, 
       screen_exclusions = 6913, 
       full_text = 274,
       full_text_exclusions = 124, 
       qualitative = 144, 
       quantitative = 144,
       width = 800, height = 1200)
## Warning in prisma_graph(found = found, found_other = found_other, no_dupes =
## no_dupes, : After full-text exclusions, a different number of remaining articles
## for qualitative synthesis is stated.

Overall N studies + participants

n_sample = dat.meta.long %>% 
    summarise(n=length(unique(paste(ID_study, Echantillons_indépendants))))

data.frame(n_sample=n_sample, dat_tot)
##     n n_studies n_es n_nexp_out n_exp_out
## 1 152       142  647       8300      7983

N studies (adjustment discarded)

dat.borenstein %>%
    group_by(outcome_SOC_agg) %>%
    summarise(n_es = sum(trial),
              n_exp = sum(n_exp),
              n_nexp = sum(n_nexp),
              n_study2 = length(unique(ID_study)))
## # A tibble: 5 x 5
##   outcome_SOC_agg                 n_es n_exp n_nexp n_study2
##   <chr>                          <dbl> <dbl>  <dbl>    <int>
## 1 Empathy                           31   507    560       13
## 2 Everyday social skills           223  5847   5506       87
## 3 Facial emotion recognition       186  2094   2168       45
## 4 Non-facial emotion recognition    28   522    580        9
## 5 Theory of mind                   179  2482   2395       52

N studies (adjustment splitted)

synth_n = dat.borenstein %>%
    group_by(outcome_SOC) %>%
    summarise(n_es = sum(trial),
              n_exp = sum(n_exp),
              n_nexp = sum(n_nexp),
              nstudy1 = n(),
              n_study2 = length(unique(ID_study)))
synth_n
## # A tibble: 10 x 6
##    outcome_SOC                                 n_es n_exp n_nexp nstudy1 n_stu~1
##    <chr>                                      <dbl> <dbl>  <dbl>   <int>   <int>
##  1 Empathy (adjusted)                             6    71     80       3       3
##  2 Empathy (non-adjusted)                        25   436    480      12      12
##  3 Everyday social skills (adjusted)             14   277    306       8       8
##  4 Everyday social skills (non-adjusted)        209  5570   5200      82      82
##  5 Facial emotion recognition (adjusted)         18   382    511       6       6
##  6 Facial emotion recognition (non-adjusted)    168  1712   1657      42      42
##  7 Non-facial emotion recognition (adjusted)      3   141    254       2       2
##  8 Non-facial emotion recognition (non-adjus~    25   381    326       8       8
##  9 Theory of mind (adjusted)                     18   198    230       7       7
## 10 Theory of mind (non-adjusted)                161  2284   2165      49      49
## # ... with abbreviated variable name 1: n_study2
dat.meta.long %>% 
    group_by(outcome_SOC) %>%
    summarise(n=length(unique(paste(ID_study, Echantillons_indépendants))))
## # A tibble: 10 x 2
##    outcome_SOC                                       n
##    <chr>                                         <int>
##  1 Empathy (adjusted)                                3
##  2 Empathy (non-adjusted)                           14
##  3 Everyday social skills (adjusted)                 8
##  4 Everyday social skills (non-adjusted)            86
##  5 Facial emotion recognition (adjusted)             7
##  6 Facial emotion recognition (non-adjusted)        44
##  7 Non-facial emotion recognition (adjusted)         2
##  8 Non-facial emotion recognition (non-adjusted)     8
##  9 Theory of mind (adjusted)                         7
## 10 Theory of mind (non-adjusted)                    52

Supplement 7. ES visualization

Distribution of ES

ggplot(dat.meta, aes(x = es_adj, y = es)) + 
  geom_jitter(alpha = 0.3, width = 0.35, size = 1/dat.meta$se) +
  geom_violin(size = 0.5, alpha = 0.5) +
theme_bw() 

Distribution of ES / outcomes

2 plots, tu choisis celui qui tu préfères

ggplot(dat.meta, aes(x = outcome_SOC_agg, y = es)) + 
      geom_jitter(width = 0.1, alpha = 0.2, aes(fill = ID, size = 1/se)) +             # geom_boxplot(trim=FALSE, alpha = 0.6) +
      facet_grid(es_adj ~ "") +
       theme_bw() +
      labs(y = "Standardized mean difference (SMD)", x = "") +
        guides(fill=FALSE) +
       coord_flip()

ggplot(dat.meta, aes(x = outcome_SOC_agg, y = es)) + 
    geom_violin(aes(fill = outcome_SOC_agg), alpha = 0.3) +
    geom_jitter(width = 0.1, alpha = 0.2, aes(fill = ID, size = 1/se)) + 
    geom_boxplot(width=0.1)+
    facet_grid(es_adj ~ "") +
    theme_bw() +
    labs(y = "Standardized mean difference (SMD)", x = "") +
    theme(text = element_text(size = 18),
          legend.position = "none",
          axis.title.y = element_text(size=12, face="bold"), 
          axis.title.x = element_text(size=12, face="bold")) +
    coord_flip()  


Supplement 8. Main analysis

Data analysis

V.SCE  <- with(dat.meta,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_SOC))

# all.equal(dat.meta$se^2, diag(unlist(V.SCE)))

SCE <- metafor::rma.mv(yi = es, V = V.SCE, 
                       data = dat.meta, 
                       mods = ~ outcome_SOC - 1,
                       random = ~ outcome_SOC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

SCE.ISQ <- metafor::rma.mv(yi = es, V = V.SCE, 
                       data = dat.meta, 
                       mods = ~ outcome_SOC - 1)
het = function(x, y) {
  i2 = NA
  for (i in 1:nrow(vcov(x))) {
    i2[i] = 100 * (vcov(x)[i,i] - vcov(y)[i,i]) / vcov(x)[i,i]
  }
  return(i2)
}


res.SCE <- data.frame(clubSandwich::coef_test(SCE, vcov = "CR2", cluster = dat.meta$ID_study)) # , cluster = df.ES$researchgroup
res.SCE.ci = data.frame(clubSandwich::conf_int(SCE, vcov = "CR2", cluster = dat.meta$ID_study))
res.SCE$target <- gsub("outcome_SOC", "", row.names(res.SCE))
res.SCE.ci$target <- gsub("outcome_SOC", "", row.names(res.SCE.ci))
res.SCE = dplyr::left_join(res.SCE, res.SCE.ci)
res.SCE$tau2 = SCE$tau2
res.SCE$I2 = het(SCE, SCE.ISQ)
res_main <- left_join(res.SCE, dat_SOC)
## Joining, by = "target"
res_main$p_Satt_bonferroni = res_main$p_Satt * 8
res_main$raw_outcome <- gsub(r"{\s*\([^\)]+\)}","",
                            as.character(res_main$outcome_SOC))

res_main$outcome_SOC <- gsub("social", "Social", res_main$outcome_SOC)
res_main$outcome_SOC <- gsub("skill", "Skill", res_main$outcome_SOC)
res_main$outcome_SOC <- gsub("emotion", "Emotion", res_main$outcome_SOC)
res_main$outcome_SOC <- gsub("recognition", "Recognition", res_main$outcome_SOC)
res_main$outcome_SOC <- gsub("mind", "Mind", res_main$outcome_SOC)
res_main$outcome_SOC <- factor(res_main$outcome_SOC, 
         levels=c('Theory of Mind (non-adjusted)',
                  'Theory of Mind (adjusted)',
                  'Empathy (non-adjusted)', 
                  'Empathy (adjusted)', 
                  'Facial Emotion Recognition (non-adjusted)',
                  'Facial Emotion Recognition (adjusted)',
                  'Non-facial Emotion Recognition (non-adjusted)',
                  'Non-facial Emotion Recognition (adjusted)',
                  'Everyday Social Skills (non-adjusted)',
                  'Everyday Social Skills (adjusted)'))

res_main[,c("beta", "SE", "tstat", "df", "p_Satt",
            "p_Satt_bonferroni", "CI_L", "CI_U", "tau2", "I2", 
            "n_studies",    "n_nexp_out" , "n_exp_out")] <- apply(
res_main[,c("beta", "SE", "tstat", "df", "p_Satt",
            "p_Satt_bonferroni", "CI_L", "CI_U", "tau2", "I2", 
            "n_studies",    "n_nexp_out" , "n_exp_out")], 2, function(x) round(x, 3))

res_main <- res_main[order(res_main$outcome_SOC), ]
DT::datatable(res_main, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

Forest plot

res_main$SE_COR = (res_main$CI_U - res_main$CI_L) / (3.92)


res_main$raw_outcome_save = res_main$raw_outcome
# res_main$raw_outcome = res_main$raw_outcome_save
res_main$raw_outcome <- factor(res_main$raw_outcome, 
         levels=c('Theory of mind',
                  'Empathy', 
                  'Facial emotion recognition',
                  'Non-facial emotion recognition',
                  'Everyday social skills'))

tab.plot <- data.frame(
  Outcome = do.call(rbind, lapply(res_main$outcome_SOC, 
                                  function(x) paste(strwrap(x, width = 60), 
                                                    collapse = "\n"))),
  n_ADHD = res_main$n_exp_out,
  n_nexpT = res_main$n_nexp_out,
  n_studies = res_main$n_studies,
  tau2 = res_main$tau2,
  I2 = paste0(round(res_main$I2), "%"))

value_num_plot = data.frame(apply(res_main[, c("beta", "SE_COR")], 2, function(x) as.numeric(as.character(x))))

forest_modif(x = value_num_plot[ ,c("beta", "SE_COR")], 
           variant = "classic",
           col = "Greys", xlab = "SMD", annotate_CI = TRUE,
           study_table = tab.plot,
           group = res_main$raw_outcome,
           type = "study_only",
           text_size = 3.5,
           x_limit = c(-1, 2),
           N = tab.plot$n_ADHD + tab.plot$n_nexpT,
           x_breaks = seq(-3, 3, 1)
           )

Diagnostics

# , eval = FALSE
# windows() ## create window to plot your file, eval = FALSE
metafor::profile.rma.mv(SCE)
## Profiling tau2 = 1

## Profiling tau2 = 2

## Profiling tau2 = 3

## Profiling tau2 = 4

## Profiling tau2 = 5

## Profiling tau2 = 6

## Profiling tau2 = 7

## Profiling tau2 = 8

## Profiling tau2 = 9

## Profiling tau2 = 10

# dev.off()

Supplement 9. Supplementary analyses

9.1. Other statistical approaches

A. Borenstein

meta.reg <- metafor::rma.mv(yi = es, V = se^2, 
                           data = dat.borenstein, 
                           random = ~ outcome_SOC | ID_study,
                           struct = "DIAG",
                           mods = ~ outcome_SOC - 1)

res.S1.a.clean = data.frame(
  beta = meta.reg$beta,
  se = meta.reg$se,
  ci_lo = meta.reg$ci.lb,
  ci_up = meta.reg$ci.ub,
  pval = meta.reg$pval, 
  target = gsub("outcome_SOC", "", row.names(meta.reg$b)))

res.S1 <- left_join(res.S1.a.clean, dat_SOC)
## Joining, by = "target"
DT::datatable(res.S1, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

B. RVE approach

robu.main <- robumeta::robu(es ~ outcome_SOC - 1, 
                            data = dat.meta, 
                            studynum = ID_study,
                            var.eff.size = se^2,
                            modelweights = "CORR",
                            small = TRUE,
                            rho = 0.8)

dat_robu_main = data.frame(
  beta = robu.main$reg_table$b.r,
  se = robu.main$reg_table$SE,
  ci_lo = robu.main$reg_table$CI.L,
  ci_up = robu.main$reg_table$CI.U,
  pval = robu.main$reg_table$prob, 
  target = gsub("outcome_SOC", "", row.names(meta.reg$b)),
  target2 = robu.main$reg_table$labels)

DT::datatable(dat_robu_main, 
              rownames = FALSE,
              extensions = 'Buttons',
              options = list(  # options
                buttons = c('copy', 'excel'),
                scrollX = TRUE,
                dom = c('ftB'), 
                autoWidth = TRUE,
                columnDefs = list(
                  list(className = 'dt-center', 
                                     targets = "_all"))))

C. SCE vs RVE vs Borenstein

res.SCE.main = data.frame(
    beta = res.SCE$beta,
    se = res.SCE$SE,
    ci_lo = res.SCE$CI_L,
    ci_up = res.SCE$CI_U,
    pval = res.SCE$p_Satt, 
    target =res.SCE$target)
res.SCE.main$Analysis = "SCE approach"
res.S1.a.clean$Analysis = "Borenstein approach"
dat_robu_main$Analysis = "RVE approach"
dat_forest_S1 = bind_rows(res.SCE.main,
                          res.S1.a.clean,
                          dat_robu_main)


meta_res_tot = meta::metagen(TE = beta, seTE = (ci_up-ci_lo)/(2*qnorm(.975)), 
                             sm = "SMD", data = dat_forest_S1,
                             subgroup = target, 
                             studlab = Analysis)

meta::forest(meta_res_tot, random = FALSE, fixed = FALSE, 
             leftcols = c("studlab"),
             text.subgroup.nohet = FALSE, print.tau2 = FALSE, print.I2 = FALSE, print.pval.Q = FALSE,
             plotwidth = "15cm", colgap.left = "1cm", colgap.right = "1cm",
             leftlabs= c(""),
             just = "right", spacing = 0.8)

9.2. Small study effects

A. Nakagawa approach

dat.meta$inv_n_tilda <- with(dat.meta, (n_nexp + n_exp)/(n_nexp*n_exp))
dat.meta$sqrt_inv_n_tilda <- with(dat.meta, sqrt(inv_n_tilda))

nak.pb = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ 1 + sqrt_inv_n_tilda + outcome_SOC,
                      random = ~ outcome_SOC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(nak.pb, vcov = "CR2", cluster = dat.meta$ID_study)
##                                                       Coef. Estimate    SE
## 1                                                   intrcpt  -0.8235 0.770
## 2                                          sqrt_inv_n_tilda   5.1445 1.879
## 3                         outcome_SOCEmpathy (non-adjusted)   0.0527 0.610
## 4              outcome_SOCEveryday social skills (adjusted)   0.9632 0.623
## 5          outcome_SOCEveryday social skills (non-adjusted)   0.8803 0.588
## 6          outcome_SOCFacial emotion recognition (adjusted)   0.1770 0.635
## 7      outcome_SOCFacial emotion recognition (non-adjusted)   0.1772 0.585
## 8      outcome_SOCNon-facial emotion recognition (adjusted)   0.0175 0.683
## 9  outcome_SOCNon-facial emotion recognition (non-adjusted)  -0.0413 0.590
## 10                     outcome_SOCTheory of mind (adjusted)   0.1883 0.591
## 11                 outcome_SOCTheory of mind (non-adjusted)   0.3697 0.585
##     t-stat  d.f. p-val (Satt) Sig.
## 1  -1.0692  2.14       0.3906     
## 2   2.7386 18.60       0.0132    *
## 3   0.0863  2.62       0.9374     
## 4   1.5448  2.68       0.2305     
## 5   1.4980  2.09       0.2679     
## 6   0.2790  2.67       0.8005     
## 7   0.3030  2.13       0.7889     
## 8   0.0257  2.96       0.9812     
## 9  -0.0699  2.12       0.9503     
## 10  0.3183  2.22       0.7777     
## 11  0.6315  2.13       0.5888

B. PET-PEESE approach

PET = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ se,
                      random = ~ outcome_SOC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(PET, vcov = "CR2", 
                        cluster = dat.meta$ID_study)
##     Coef. Estimate    SE t-stat d.f. p-val (Satt) Sig.
## 1 intrcpt    -2.88 0.429  -6.71 70.4       <0.001  ***
## 2      se    14.31 1.603   8.93 23.6       <0.001  ***
dat.meta$var = dat.meta$se^2
PET = metafor::rma.mv(yi = es, V = V.SCE, 
                      data = dat.meta, 
                      mods = ~ var,
                      random = ~ outcome_SOC | ID_study,
                      struct = "DIAG",
                      sparse = TRUE)
clubSandwich::coef_test(PET, vcov = "CR2", 
                        cluster = dat.meta$ID_study)
##     Coef. Estimate   SE t-stat d.f. p-val (Satt) Sig.
## 1 intrcpt   -0.872 0.18  -4.83 75.4       <0.001  ***
## 2     var   23.246 2.36   9.85 18.8       <0.001  ***

C. Egger’s test for each outcome

dat_egger = data.frame(
  meta_review = "Haza",
  study = dat.borenstein$ID_study,
  factor = dat.borenstein$outcome_SOC,
  value = dat.borenstein$es,
  se = dat.borenstein$se,
  n_cases = dat.borenstein$n_exp,
  n_controls = dat.borenstein$n_nexp,
  measure = "G")
  
umb = metaumbrella::umbrella(dat_egger)
## Analyzing factor: Theory of mind (non-adjusted) 
## Analyzing factor: Everyday social skills (non-adjusted) 
## Analyzing factor: Everyday social skills (adjusted) 
## Analyzing factor: Empathy (adjusted) 
## Analyzing factor: Facial emotion recognition (non-adjusted) 
## Analyzing factor: Non-facial emotion recognition (non-adjusted) 
## Analyzing factor: Facial emotion recognition (adjusted) 
## Analyzing factor: Theory of mind (adjusted) 
## Analyzing factor: Empathy (non-adjusted) 
## Analyzing factor: Non-facial emotion recognition (adjusted)
umb
## 
## Umbrella review:
##                                           Factor n_studies total_n n_cases
## 1                  Theory of mind (non-adjusted)        49    4449    2284
## 2          Everyday social skills (non-adjusted)        82   10770    5570
## 3              Everyday social skills (adjusted)         8     583     277
## 4                             Empathy (adjusted)         3     151      71
## 5      Facial emotion recognition (non-adjusted)        42    3369    1712
## 6  Non-facial emotion recognition (non-adjusted)         8     707     381
## 7          Facial emotion recognition (adjusted)         6     893     382
## 8                      Theory of mind (adjusted)         7     428     198
## 9                         Empathy (non-adjusted)        12     916     436
## 10     Non-facial emotion recognition (adjusted)         2     395     141
##    n_controls measure value        value_CI    eG           eG_CI    eOR
## 1        2165       G 0.837  [0.683, 0.992] 0.837  [0.683, 0.992]  4.567
## 2        5200       G 1.224  [1.081, 1.366] 1.224  [1.081, 1.366]  9.201
## 3         306       G 1.465   [1.011, 1.92] 1.465   [1.011, 1.92] 14.268
## 4          80       G 0.704 [-0.149, 1.558] 0.704 [-0.149, 1.558]  3.586
## 5        1657       G 0.629   [0.46, 0.798] 0.629   [0.46, 0.798]  3.129
## 6         326       G 0.323   [0.076, 0.57] 0.323   [0.076, 0.57]  1.795
## 7         511       G 0.388   [0.205, 0.57] 0.388   [0.205, 0.57]  2.021
## 8         230       G 0.735  [0.483, 0.987] 0.735  [0.483, 0.987]  3.795
## 9         480       G 0.563  [0.149, 0.977] 0.563  [0.149, 0.977]  2.776
## 10        254       G 0.166 [-0.039, 0.371] 0.166 [-0.039, 0.371]  1.352
##             eOR_CI  p_value     I2            PI_eG             PI_eOR
## 1   [3.453, 6.041] 1.90e-26 79.683  [-0.152, 1.826]     [0.76, 27.453]
## 2    [7.1, 11.923] 3.18e-63 88.756   [0.006, 2.441]    [1.011, 83.755]
## 3  [6.261, 32.516] 2.54e-10 80.824  [-0.093, 3.024]   [0.845, 240.955]
## 4  [0.763, 16.865] 1.06e-01 85.352 [-9.768, 11.176] [0, 636178738.813]
## 5   [2.303, 4.252] 3.04e-13 86.203  [-0.398, 1.656]    [0.486, 20.141]
## 6   [1.147, 2.811] 1.05e-02 60.343   [-0.42, 1.066]     [0.467, 6.909]
## 7   [1.451, 2.814] 3.14e-05 48.174  [-0.112, 0.888]     [0.816, 5.003]
## 8   [2.403, 5.995] 1.07e-08 44.783   [0.068, 1.402]    [1.132, 12.727]
## 9   [1.311, 5.881] 7.67e-03 85.329  [-1.026, 2.152]    [0.155, 49.577]
## 10  [0.932, 1.961] 1.12e-01  0.000      < 3 studies        < 3 studies
##        egger_p    ESB_p power_med     JK_p   largest_CI_eG   largest_CI_eOR rob
## 1     5.11e-01 6.36e-01     100.0 4.07e-25  [0.478, 1.536]  [2.379, 16.202]  NA
## 2     7.16e-05 1.42e-02     100.0 2.41e-61  [0.421, 0.722]   [2.145, 3.707]  NA
## 3     1.12e-01 2.37e-01     100.0 8.11e-08  [0.623, 1.315]  [3.095, 10.864]  NA
## 4     7.95e-01 4.94e-01      86.1 3.04e-01   [0.97, 2.069]   [5.806, 42.66]  NA
## 5     7.97e-01 9.48e-01     100.0 1.75e-12  [1.684, 2.302] [21.228, 65.088]  NA
## 6     4.20e-02 4.10e-01     100.0 3.37e-02 [-0.282, 0.333]      [0.6, 1.83]  NA
## 7     2.24e-01 4.52e-01     100.0 5.12e-03   [0.166, 0.63]   [1.352, 3.133]  NA
## 8     2.58e-01 9.02e-01      99.9 2.21e-06  [0.271, 0.939]   [1.634, 5.494]  NA
## 9     2.66e-01 6.64e-01     100.0 1.95e-02    [0.02, 0.77]   [1.036, 4.044]  NA
## 10 < 3 studies     <NA>      99.7 6.41e-01   [-0.05, 0.41]   [0.914, 2.102]  NA
##    amstar
## 1      NA
## 2      NA
## 3      NA
## 4      NA
## 5      NA
## 6      NA
## 7      NA
## 8      NA
## 9      NA
## 10     NA

9.3. Type of publication

A. Overall

dat.meta4 = subset(dat.meta, Type_publication %in% 
                     c("Article", "Thèse"))
V.SCE4  <- with(dat.meta4,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_SOC))

SCE.S4 <- metafor::rma.mv(yi = es, V = V.SCE4, 
                       data = dat.meta4, 
                       mods = ~ Type_publication,
                       random = ~ outcome_SOC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

clubSandwich::coef_test(SCE.S4, vcov = "CR2", cluster = dat.meta4$ID_study)
##                   Coef. Estimate    SE t-stat d.f. p-val (Satt) Sig.
## 1               intrcpt    0.833 0.055 15.142 79.3       <0.001  ***
## 2 Type_publicationThèse    0.108 0.118  0.916 11.7        0.378
SCE.S4 <- metafor::rma.mv(yi = es, V = V.SCE4, 
                       data = dat.meta4, 
                       mods = ~ Type_publication - 1,
                       random = ~ outcome_SOC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)
clubSandwich::coef_test(SCE.S4, vcov = "CR2", cluster = dat.meta4$ID_study)
##                     Coef. Estimate    SE t-stat  d.f. p-val (Satt) Sig.
## 1 Type_publicationArticle    0.833 0.055  15.14 79.28       <0.001  ***
## 2   Type_publicationThèse    0.941 0.104   9.06  9.29       <0.001  ***

B. Everyday social skills

dat.meta4 = subset(dat.meta, Type_publication %in% 
                     c("Article", "Thèse") & outcome_SOC == "Everyday social skills (non-adjusted)")
dat.meta4$var = dat.meta4$se^2
SCE.S4 <- metafor::rma.mv(yi = es, V = var, 
                       data = dat.meta4, 
                       mods = ~ Type_publication,
                       random = ~ outcome_SOC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

clubSandwich::coef_test(SCE.S4, vcov = "CR2", cluster = dat.meta4$ID_study)
##                   Coef. Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1               intrcpt    1.099 0.0678  16.20 69.22       <0.001  ***
## 2 Type_publicationThèse    0.351 0.1829   1.92  9.76       0.0844    .
SCE.S4 <- metafor::rma.mv(yi = es, V = var, 
                       data = dat.meta4, 
                       mods = ~ Type_publication - 1,
                       random = ~ outcome_SOC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)
clubSandwich::coef_test(SCE.S4, vcov = "CR2", cluster = dat.meta4$ID_study)
##                     Coef. Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1 Type_publicationArticle     1.10 0.0678  16.20 69.22       <0.001  ***
## 2   Type_publicationThèse     1.45 0.1699   8.53  7.85       <0.001  ***

C. Theory of mind

dat.meta4 = subset(dat.meta, Type_publication %in% 
                     c("Article", "Thèse") & outcome_SOC == "Theory of mind (non-adjusted)")
dat.meta4$var = dat.meta4$se^2
SCE.S4 <- metafor::rma.mv(yi = es, V = var, 
                       data = dat.meta4, 
                       mods = ~ Type_publication,
                       random = ~ outcome_SOC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

clubSandwich::coef_test(SCE.S4, vcov = "CR2", cluster = dat.meta4$ID_study)
##                   Coef. Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1               intrcpt    0.821 0.0784 10.471 40.76       <0.001  ***
## 2 Type_publicationThèse   -0.222 0.2527 -0.878  5.87        0.414
SCE.S4 <- metafor::rma.mv(yi = es, V = var, 
                       data = dat.meta4, 
                       mods = ~ Type_publication - 1,
                       random = ~ outcome_SOC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)
clubSandwich::coef_test(SCE.S4, vcov = "CR2", cluster = dat.meta4$ID_study)
##                     Coef. Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1 Type_publicationArticle    0.821 0.0784   10.5 40.76       <0.001  ***
## 2   Type_publicationThèse    0.599 0.2402    2.5  4.68       0.0581    .

D. Theory of mind

dat.meta4 = subset(dat.meta, Type_publication %in% 
                     c("Article", "Thèse") & outcome_SOC == "Non-facial emotion recognition (non-adjusted)")
dat.meta4$var = dat.meta4$se^2
SCE.S4 <- metafor::rma.mv(yi = es, V = var, 
                       data = dat.meta4, 
                       mods = ~ Type_publication,
                       random = ~ outcome_SOC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)

clubSandwich::coef_test(SCE.S4, vcov = "CR2", cluster = dat.meta4$ID_study)
##                   Coef. Estimate    SE t-stat d.f. p-val (Satt) Sig.
## 1               intrcpt    0.223 0.100   2.23 5.59       0.0708    .
## 2 Type_publicationThèse    0.814 0.104   7.80 6.11       <0.001  ***
SCE.S4 <- metafor::rma.mv(yi = es, V = var, 
                       data = dat.meta4, 
                       mods = ~ Type_publication - 1,
                       random = ~ outcome_SOC | ID_study,
                       struct = "DIAG",
                       sparse = TRUE)
clubSandwich::coef_test(SCE.S4, vcov = "CR2", cluster = dat.meta4$ID_study)
##                     Coef. Estimate     SE t-stat d.f. p-val (Satt) Sig.
## 1 Type_publicationArticle    0.223 0.1003   2.23 5.59       0.0708    .
## 2   Type_publicationThèse    1.037 0.0287  36.14 1.00       0.0176    *

9.4. Effect of rob

dat.meta.S10 = subset(dat.meta, !is.na(rob_tot) & outcome_SOC %in% unique(synth_n$outcome_SOC[synth_n$nstudy1 > 20]))
V.SCE.S10  <- with(dat.meta.S10,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_SOC))


SCE.S10 <- metafor::rma.mv(yi = es, V = V.SCE.S10, 
                          data = dat.meta.S10, 
                          mods = ~ rob_tot * outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S10, vcov = "CR2", cluster = dat.meta.S10$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt   0.5467 0.3695
## 2                                                      rob_tot   0.1166 0.0619
## 3         outcome_SOCFacial emotion recognition (non-adjusted)  -0.3009 0.5162
## 4                     outcome_SOCTheory of mind (non-adjusted)   0.1267 0.4207
## 5 rob_tot:outcome_SOCFacial emotion recognition (non-adjusted)  -0.0561 0.0873
## 6             rob_tot:outcome_SOCTheory of mind (non-adjusted)  -0.0903 0.0701
##   t-stat  d.f. p-val (Satt) Sig.
## 1  1.480  5.76        0.191     
## 2  1.883  4.23        0.129     
## 3 -0.583 20.32        0.566     
## 4  0.301  6.05        0.773     
## 5 -0.643 19.31        0.528     
## 6 -1.287  4.93        0.255
anova(SCE.S10, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 4.8683, p-val = 0.0877
SCE.S10 <- metafor::rma.mv(yi = es, V = V.SCE.S10, 
                          data = dat.meta.S10, 
                          mods = ~ rob_tot + outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S10, vcov = "CR2", cluster = dat.meta.S10$ID_study)
##                                                  Coef. Estimate     SE t-stat
## 1                                              intrcpt   0.7554 0.2263   3.34
## 2                                              rob_tot   0.0807 0.0365   2.21
## 3 outcome_SOCFacial emotion recognition (non-adjusted)  -0.6380 0.1089  -5.86
## 4             outcome_SOCTheory of mind (non-adjusted)  -0.4263 0.1062  -4.01
##    d.f. p-val (Satt) Sig.
## 1 10.30      0.00723   **
## 2  6.01      0.06911    .
## 3 80.86      < 0.001  ***
## 4 89.68      < 0.001  ***
ggplot(dat.meta.S10, aes(x = rob_tot, y = es)) +
    facet_wrap(~outcome_SOC) +
    geom_point(size = 2, alpha = 0.2) + 
    geom_smooth() + #method ="lm"
    theme_bw()

## 9.5. Effect of age

a. Age

dat.meta.S6 = subset(dat.meta, !is.na(age) & outcome_SOC %in% unique(synth_n$outcome_SOC[synth_n$nstudy1 > 20]))
V.SCE.S6  <- with(dat.meta.S6,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_SOC))


SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age * outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                      Coef. Estimate    SE
## 1                                                  intrcpt    2.553 1.064
## 2                                                      age   -0.129 0.104
## 3     outcome_SOCFacial emotion recognition (non-adjusted)   -1.795 1.209
## 4                 outcome_SOCTheory of mind (non-adjusted)   -1.396 1.356
## 5 age:outcome_SOCFacial emotion recognition (non-adjusted)    0.118 0.118
## 6             age:outcome_SOCTheory of mind (non-adjusted)    0.100 0.130
##   t-stat d.f. p-val (Satt) Sig.
## 1  2.401 17.6       0.0276    *
## 2 -1.244 15.4       0.2320     
## 3 -1.485 32.1       0.1474     
## 4 -1.029 33.8       0.3107     
## 5  0.995 26.1       0.3291     
## 6  0.771 29.7       0.4470
anova(SCE.S6, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 8.0036, p-val = 0.0183
SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age + outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                  Coef. Estimate     SE t-stat
## 1                                              intrcpt   1.8888 0.5003   3.78
## 2                                                  age  -0.0647 0.0483  -1.34
## 3 outcome_SOCFacial emotion recognition (non-adjusted)  -0.5582 0.1185  -4.71
## 4             outcome_SOCTheory of mind (non-adjusted)  -0.3443 0.1096  -3.14
##   d.f. p-val (Satt) Sig.
## 1 41.3      < 0.001  ***
## 2 32.0      0.18929     
## 3 76.6      < 0.001  ***
## 4 90.2      0.00227   **

b. Age diff

dat.meta.S6 = subset(dat.meta, !is.na(age_diff) & outcome_SOC %in% unique(synth_n$outcome_SOC[synth_n$nstudy1 > 20]))
V.SCE.S6  <- with(dat.meta.S6,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_SOC))


SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age_diff * outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                           Coef. Estimate     SE
## 1                                                       intrcpt  1.22237 0.0772
## 2                                                      age_diff -0.05056 0.2305
## 3          outcome_SOCFacial emotion recognition (non-adjusted) -0.58079 0.1136
## 4                      outcome_SOCTheory of mind (non-adjusted) -0.38312 0.1069
## 5 age_diff:outcome_SOCFacial emotion recognition (non-adjusted) -0.06429 0.2504
## 6             age_diff:outcome_SOCTheory of mind (non-adjusted)  0.00341 0.2571
##    t-stat  d.f. p-val (Satt) Sig.
## 1 15.8261 79.18       <0.001  ***
## 2 -0.2194  3.46        0.839     
## 3 -5.1138 81.60       <0.001  ***
## 4 -3.5832 93.60       <0.001  ***
## 5 -0.2567  5.33        0.807     
## 6  0.0133  5.56        0.990
anova(SCE.S6, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 2.3735, p-val = 0.3052
SCE.S6 <- metafor::rma.mv(yi = es, V = V.SCE.S6, 
                          data = dat.meta.S6, 
                          mods = ~ age_diff + outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S6, vcov = "CR2", cluster = dat.meta.S6$ID_study)
##                                                  Coef. Estimate     SE t-stat
## 1                                              intrcpt   1.2215 0.0749  16.31
## 2                                             age_diff  -0.0642 0.0594  -1.08
## 3 outcome_SOCFacial emotion recognition (non-adjusted)  -0.5856 0.1118  -5.24
## 4             outcome_SOCTheory of mind (non-adjusted)  -0.3824 0.1058  -3.61
##    d.f. p-val (Satt) Sig.
## 1 79.24       <0.001  ***
## 2  6.62        0.318     
## 3 82.32       <0.001  ***
## 4 93.57       <0.001  ***

9.6. Effect of sex

dat.meta.S8 = subset(dat.meta, !is.na(sex) & outcome_SOC %in% unique(synth_n$outcome_SOC[synth_n$nstudy1 > 20]))
dat.meta.S8$sex = as.numeric(as.character(dat.meta.S8$sex))
dat.meta.S8$sex[dat.meta.S8$sex > 100] <- NA
V.SCE.S8  <- with(dat.meta.S8,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_SOC))


SCE.S8 <- metafor::rma.mv(yi = es, V = V.SCE.S8, 
                          data = dat.meta.S8, 
                          mods = ~ sex * outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S8, vcov = "CR2", cluster = dat.meta.S8$ID_study)
##                                                      Coef.  Estimate      SE
## 1                                                  intrcpt  1.243430 0.25560
## 2                                                      sex -0.000479 0.00869
## 3     outcome_SOCFacial emotion recognition (non-adjusted) -0.658205 0.32975
## 4                 outcome_SOCTheory of mind (non-adjusted) -0.429270 0.30035
## 5 sex:outcome_SOCFacial emotion recognition (non-adjusted)  0.000484 0.01196
## 6             sex:outcome_SOCTheory of mind (non-adjusted)  0.001302 0.00989
##    t-stat  d.f. p-val (Satt) Sig.
## 1  4.8648 26.53       <0.001  ***
## 2 -0.0551  5.52       0.9580     
## 3 -1.9961 20.69       0.0593    .
## 4 -1.4293 23.35       0.1662     
## 5  0.0404  9.38       0.9686     
## 6  0.1316  9.16       0.8981
anova(SCE.S8, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 0.0875, p-val = 0.9572
SCE.S8 <- metafor::rma.mv(yi = es, V = V.SCE.S8, 
                          data = dat.meta.S8, 
                          mods = ~ sex + outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S8, vcov = "CR2", cluster = dat.meta.S8$ID_study)
##                                                  Coef.  Estimate      SE
## 1                                              intrcpt  1.234448 0.17429
## 2                                                  sex -0.000158 0.00562
## 3 outcome_SOCFacial emotion recognition (non-adjusted) -0.645192 0.11575
## 4             outcome_SOCTheory of mind (non-adjusted) -0.395797 0.11345
##    t-stat d.f. p-val (Satt) Sig.
## 1  7.0826 51.9       <0.001  ***
## 2 -0.0282 10.6        0.978     
## 3 -5.5739 68.9       <0.001  ***
## 4 -3.4886 79.9       <0.001  ***

9.7. Effect of IQ

a. IQ

dat.meta.S9 = subset(dat.meta, !is.na(iq) & outcome_SOC %in% unique(synth_n$outcome_SOC[synth_n$nstudy1 > 20]))
dat.meta.S9$iq = as.numeric(as.character(dat.meta.S9$iq))
# dat.meta.S9$iq[dat.meta.S9$iq > 100] <- NA
V.SCE.S9  <- with(dat.meta.S9,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_SOC))


SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq * outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                     Coef. Estimate     SE
## 1                                                 intrcpt  -0.3518 6.8961
## 2                                                      iq   0.0155 0.0663
## 3    outcome_SOCFacial emotion recognition (non-adjusted)   1.6808 7.1994
## 4                outcome_SOCTheory of mind (non-adjusted)  -1.6393 9.7749
## 5 iq:outcome_SOCFacial emotion recognition (non-adjusted)  -0.0232 0.0692
## 6             iq:outcome_SOCTheory of mind (non-adjusted)   0.0110 0.0940
##   t-stat d.f. p-val (Satt) Sig.
## 1 -0.051 5.67        0.961     
## 2  0.234 5.84        0.823     
## 3  0.233 7.63        0.822     
## 4 -0.168 4.27        0.874     
## 5 -0.336 7.66        0.746     
## 6  0.117 4.14        0.912
anova(SCE.S9, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 2.2783, p-val = 0.3201
SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq + outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                  Coef. Estimate     SE  t-stat
## 1                                              intrcpt  -0.0663 4.0402 -0.0164
## 2                                                   iq   0.0128 0.0389  0.3283
## 3 outcome_SOCFacial emotion recognition (non-adjusted)  -0.7279 0.1509 -4.8238
## 4             outcome_SOCTheory of mind (non-adjusted)  -0.4857 0.1346 -3.6085
##    d.f. p-val (Satt) Sig.
## 1  9.10        0.987     
## 2  9.18        0.750     
## 3 40.33       <0.001  ***
## 4 40.31       <0.001  ***

b. IQ diff

dat.meta.S9 = subset(dat.meta, !is.na(iq_diff) & outcome_SOC %in% unique(synth_n$outcome_SOC[synth_n$nstudy1 > 20]))
dat.meta.S9$iq_diff = as.numeric(as.character(dat.meta.S9$iq_diff))


SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq_diff * outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                          Coef. Estimate     SE
## 1                                                      intrcpt  1.30952 0.3955
## 2                                                      iq_diff  0.00529 0.0422
## 3         outcome_SOCFacial emotion recognition (non-adjusted) -0.79424 0.4062
## 4                     outcome_SOCTheory of mind (non-adjusted) -0.42626 0.4813
## 5 iq_diff:outcome_SOCFacial emotion recognition (non-adjusted) -0.00868 0.0451
## 6             iq_diff:outcome_SOCTheory of mind (non-adjusted)  0.00934 0.0542
##   t-stat  d.f. p-val (Satt) Sig.
## 1  3.311 29.29      0.00247   **
## 2  0.126  5.55      0.90453     
## 3 -1.955 34.67      0.05865    .
## 4 -0.886 30.49      0.38277     
## 5 -0.193  3.19      0.85886     
## 6  0.172  5.47      0.86926
anova(SCE.S9, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 1.9094, p-val = 0.3849
SCE.S9 <- metafor::rma.mv(yi = es, V = V.SCE.S9, 
                          data = dat.meta.S9, 
                          mods = ~ iq_diff + outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S9, vcov = "CR2", cluster = dat.meta.S9$ID_study)
##                                                  Coef. Estimate     SE t-stat
## 1                                              intrcpt  1.31939 0.2590  5.095
## 2                                              iq_diff  0.00642 0.0248  0.259
## 3 outcome_SOCFacial emotion recognition (non-adjusted) -0.76165 0.1918 -3.970
## 4             outcome_SOCTheory of mind (non-adjusted) -0.49280 0.1396 -3.531
##    d.f. p-val (Satt) Sig.
## 1 32.89      < 0.001  ***
## 2  8.41      0.80171     
## 3 40.40      < 0.001  ***
## 4 40.68      0.00105   **

9.8. ADHD presentation

a. Inattentive

dat.meta.S12.a = subset(dat.meta, !is.na(percentage_inattentive) & outcome_SOC %in% unique(synth_n$outcome_SOC[synth_n$nstudy1 > 20]))
dat.meta.S12.a$percentage_inattentive = as.numeric(as.character(dat.meta.S12.a$percentage_inattentive))
V.SCE.S12.a  <- with(dat.meta.S12.a,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_SOC))


SCE.S12.a <- metafor::rma.mv(yi = es, V = V.SCE.S12.a, 
                          data = dat.meta.S12.a, 
                          mods = ~ percentage_inattentive * outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.a, vcov = "CR2", cluster = dat.meta.S12.a$ID_study)
##                                                                         Coef.
## 1                                                                     intrcpt
## 2                                                      percentage_inattentive
## 3                        outcome_SOCFacial emotion recognition (non-adjusted)
## 4                                    outcome_SOCTheory of mind (non-adjusted)
## 5 percentage_inattentive:outcome_SOCFacial emotion recognition (non-adjusted)
## 6             percentage_inattentive:outcome_SOCTheory of mind (non-adjusted)
##    Estimate       SE  t-stat  d.f. p-val (Satt) Sig.
## 1  1.32e+00 0.113410 11.6781 33.71       <0.001  ***
## 2 -2.86e-03 0.000695 -4.1188  1.13       0.1286     
## 3 -5.48e-01 0.196898 -2.7852 14.36       0.0143    *
## 4 -4.12e-01 0.176998 -2.3283 37.36       0.0254    *
## 5 -8.56e-05 0.005910 -0.0145  8.43       0.9888     
## 6  3.67e-03 0.001225  2.9920  1.08       0.1902
anova(SCE.S12.a, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 32.4162, p-val < .0001
SCE.S12.a <- metafor::rma.mv(yi = es, V = V.SCE.S12.a, 
                          data = dat.meta.S12.a, 
                          mods = ~ percentage_inattentive:outcome_SOC - 1,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.a, vcov = "CR2", cluster = dat.meta.S12.a$ID_study)
##                                                                         Coef.
## 1     percentage_inattentive:outcome_SOCEveryday social skills (non-adjusted)
## 2 percentage_inattentive:outcome_SOCFacial emotion recognition (non-adjusted)
## 3             percentage_inattentive:outcome_SOCTheory of mind (non-adjusted)
##    Estimate       SE t-stat d.f. p-val (Satt) Sig.
## 1 -0.002798 0.000796  -3.52 1.13       0.1538     
## 2  0.013227 0.005375   2.46 7.34       0.0419    *
## 3  0.000974 0.000755   1.29 1.02       0.4167

b. Hyperactive

dat.meta.S12.b = subset(dat.meta, !is.na(percentage_hyperactive) & outcome_SOC %in% unique(synth_n$outcome_SOC[synth_n$nstudy1 > 20]))
dat.meta.S12.b$percentage_hyperactive = as.numeric(as.character(dat.meta.S12.b$percentage_hyperactive))
V.SCE.S12.b  <- with(dat.meta.S12.b,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_SOC))


SCE.S12.b <- metafor::rma.mv(yi = es, V = V.SCE.S12.b, 
                          data = dat.meta.S12.b, 
                          mods = ~ percentage_hyperactive * outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.b, vcov = "CR2", cluster = dat.meta.S12.b$ID_study)
##                                                                         Coef.
## 1                                                                     intrcpt
## 2                                                      percentage_hyperactive
## 3                        outcome_SOCFacial emotion recognition (non-adjusted)
## 4                                    outcome_SOCTheory of mind (non-adjusted)
## 5 percentage_hyperactive:outcome_SOCFacial emotion recognition (non-adjusted)
## 6             percentage_hyperactive:outcome_SOCTheory of mind (non-adjusted)
##   Estimate     SE  t-stat  d.f. p-val (Satt) Sig.
## 1  1.25830 0.1581  7.9603 32.46      < 0.001  ***
## 2  0.00081 0.0106  0.0763  1.16      0.95022     
## 3 -0.60474 0.2006 -3.0142 34.81      0.00478   **
## 4 -0.37515 0.2202 -1.7039 36.61      0.09687    .
## 5  0.00380 0.0120  0.3162  1.61      0.78799     
## 6  0.00587 0.0193  0.3038  1.89      0.79146
anova(SCE.S12.b, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 2.3925, p-val = 0.3023
SCE.S12.b <- metafor::rma.mv(yi = es, V = V.SCE.S12.b, 
                          data = dat.meta.S12.b, 
                          mods = ~ percentage_hyperactive+outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.b, vcov = "CR2", cluster = dat.meta.S12.b$ID_study)
##                                                  Coef. Estimate      SE t-stat
## 1                                              intrcpt  1.24936 0.13732  9.098
## 2                               percentage_hyperactive  0.00173 0.00717  0.241
## 3 outcome_SOCFacial emotion recognition (non-adjusted) -0.56989 0.16503 -3.453
## 4             outcome_SOCTheory of mind (non-adjusted) -0.32441 0.17159 -1.891
##    d.f. p-val (Satt) Sig.
## 1 32.74      < 0.001  ***
## 2  1.52      0.83834     
## 3 38.07      0.00137   **
## 4 38.57      0.06621    .

c. Combined

dat.meta.S12.c = subset(dat.meta, !is.na(percentage_combined) & outcome_SOC %in% unique(synth_n$outcome_SOC[synth_n$nstudy1 > 20]))
dat.meta.S12.c$percentage_combined = as.numeric(as.character(dat.meta.S12.c$percentage_combined))
V.SCE.S12.c  <- with(dat.meta.S12.c,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_SOC))


SCE.S12.c <- metafor::rma.mv(yi = es, V = V.SCE.S12.c, 
                          data = dat.meta.S12.c, 
                          mods = ~ percentage_combined * outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.c, vcov = "CR2", cluster = dat.meta.S12.c$ID_study)
##                                                                      Coef.
## 1                                                                  intrcpt
## 2                                                      percentage_combined
## 3                     outcome_SOCFacial emotion recognition (non-adjusted)
## 4                                 outcome_SOCTheory of mind (non-adjusted)
## 5 percentage_combined:outcome_SOCFacial emotion recognition (non-adjusted)
## 6             percentage_combined:outcome_SOCTheory of mind (non-adjusted)
##   Estimate       SE t-stat  d.f. p-val (Satt) Sig.
## 1  1.05819 0.129211  8.190 31.17       <0.001  ***
## 2  0.00298 0.000579  5.149  1.06       0.1112     
## 3 -0.26033 0.342024 -0.761  7.54       0.4697     
## 4 -0.06668 0.188632 -0.353 34.10       0.7259     
## 5 -0.00461 0.004234 -1.089  7.45       0.3101     
## 6 -0.00388 0.000625 -6.217  1.06       0.0916    .
anova(SCE.S12.c, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 36.8800, p-val < .0001
SCE.S12.c <- metafor::rma.mv(yi = es, V = V.SCE.S12.c, 
                          data = dat.meta.S12.c, 
                          mods = ~ percentage_combined+outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S12.c, vcov = "CR2", cluster = dat.meta.S12.c$ID_study)
##                                                  Coef. Estimate       SE t-stat
## 1                                              intrcpt  1.15081 0.122445   9.40
## 2                                  percentage_combined  0.00158 0.000398   3.96
## 3 outcome_SOCFacial emotion recognition (non-adjusted) -0.55606 0.162475  -3.42
## 4             outcome_SOCTheory of mind (non-adjusted) -0.30168 0.173448  -1.74
##    d.f. p-val (Satt) Sig.
## 1 32.55      < 0.001  ***
## 2  1.09      0.14190     
## 3 38.24      0.00149   **
## 4 38.65      0.08994    .

9.9. Effect of comorbidities

a. ASD

dat.meta.S7_a = subset(dat.meta, !is.na(percentage_ASD) & outcome_SOC %in% unique(synth_n$outcome_SOC[synth_n$nstudy1 > 20]) & percentage_ASD %in% c(0,100))
dat.meta.S7_a$percentage_ASD = factor(dat.meta.S7_a$percentage_ASD)
V.SCE.S7_a  <- with(dat.meta.S7_a,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_SOC))


SCE.S7_a <- metafor::rma.mv(yi = es, V = V.SCE.S7_a, 
                          data = dat.meta.S7_a, 
                          mods = ~ percentage_ASD * outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S7_a, vcov = "CR2", cluster = dat.meta.S7_a$ID_study)
##                                                                    Coef.
## 1                                                                intrcpt
## 2                                                      percentage_ASD100
## 3                   outcome_SOCFacial emotion recognition (non-adjusted)
## 4                               outcome_SOCTheory of mind (non-adjusted)
## 5 percentage_ASD100:outcome_SOCFacial emotion recognition (non-adjusted)
## 6             percentage_ASD100:outcome_SOCTheory of mind (non-adjusted)
##   Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1    1.332 0.0961  13.86 45.40      < 0.001  ***
## 2    1.059 0.2195   4.82  4.62      0.00588   **
## 3   -0.764 0.1357  -5.63 49.28      < 0.001  ***
## 4   -0.466 0.1464  -3.18 50.34      0.00252   **
## 5   -0.979 0.2187  -4.48  2.62      0.02762    *
## 6   -0.753 0.2504  -3.01  3.48      0.04751    *
anova(SCE.S7_a, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 188.0975, p-val < .0001
SCE.S7_a_ph = metafor::rma.mv(yi = es, V = V.SCE.S7_a, 
                data = dat.meta.S7_a, 
                mods = ~ percentage_ASD : outcome_SOC - 1,
                random = ~ outcome_SOC | ID_study,
                struct = "DIAG",
                sparse = TRUE)
SCE.S7_a_ph
## 
## Multivariate Meta-Analysis Model (k = 363; method: REML)
## 
## Variance Components:
## 
## outer factor: ID_study    (nlvls = 73)
## inner factor: outcome_SOC (nlvls = 3)
## 
##             estim    sqrt  k.lvl  fixed 
## tau^2.1    0.3631  0.6026    120     no 
## tau^2.2    0.2204  0.4695    131     no 
## tau^2.3    0.3215  0.5670    112     no 
##                                                level 
## tau^2.1        Everyday social skills (non-adjusted) 
## tau^2.2    Facial emotion recognition (non-adjusted) 
## tau^2.3                Theory of mind (non-adjusted) 
## 
## Test for Residual Heterogeneity:
## QE(df = 357) = 6176.7284, p-val < .0001
## 
## Test of Moderators (coefficients 1:6):
## QM(df = 6) = 797.9450, p-val < .0001
## 
## Model Results:
## 
##                                                                         estimate 
## percentage_ASD0:outcome_SOCEveryday social skills (non-adjusted)          1.3318 
## percentage_ASD100:outcome_SOCEveryday social skills (non-adjusted)        2.3908 
## percentage_ASD0:outcome_SOCFacial emotion recognition (non-adjusted)      0.5677 
## percentage_ASD100:outcome_SOCFacial emotion recognition (non-adjusted)    0.6479 
## percentage_ASD0:outcome_SOCTheory of mind (non-adjusted)                  0.8663 
## percentage_ASD100:outcome_SOCTheory of mind (non-adjusted)                1.1725 
##                                                                             se 
## percentage_ASD0:outcome_SOCEveryday social skills (non-adjusted)        0.0963 
## percentage_ASD100:outcome_SOCEveryday social skills (non-adjusted)      0.1062 
## percentage_ASD0:outcome_SOCFacial emotion recognition (non-adjusted)    0.1044 
## percentage_ASD100:outcome_SOCFacial emotion recognition (non-adjusted)  0.1190 
## percentage_ASD0:outcome_SOCTheory of mind (non-adjusted)                0.1149 
## percentage_ASD100:outcome_SOCTheory of mind (non-adjusted)              0.1250 
##                                                                            zval 
## percentage_ASD0:outcome_SOCEveryday social skills (non-adjusted)        13.8268 
## percentage_ASD100:outcome_SOCEveryday social skills (non-adjusted)      22.5104 
## percentage_ASD0:outcome_SOCFacial emotion recognition (non-adjusted)     5.4402 
## percentage_ASD100:outcome_SOCFacial emotion recognition (non-adjusted)   5.4440 
## percentage_ASD0:outcome_SOCTheory of mind (non-adjusted)                 7.5418 
## percentage_ASD100:outcome_SOCTheory of mind (non-adjusted)               9.3791 
##                                                                           pval 
## percentage_ASD0:outcome_SOCEveryday social skills (non-adjusted)        <.0001 
## percentage_ASD100:outcome_SOCEveryday social skills (non-adjusted)      <.0001 
## percentage_ASD0:outcome_SOCFacial emotion recognition (non-adjusted)    <.0001 
## percentage_ASD100:outcome_SOCFacial emotion recognition (non-adjusted)  <.0001 
## percentage_ASD0:outcome_SOCTheory of mind (non-adjusted)                <.0001 
## percentage_ASD100:outcome_SOCTheory of mind (non-adjusted)              <.0001 
##                                                                          ci.lb 
## percentage_ASD0:outcome_SOCEveryday social skills (non-adjusted)        1.1431 
## percentage_ASD100:outcome_SOCEveryday social skills (non-adjusted)      2.1826 
## percentage_ASD0:outcome_SOCFacial emotion recognition (non-adjusted)    0.3632 
## percentage_ASD100:outcome_SOCFacial emotion recognition (non-adjusted)  0.4146 
## percentage_ASD0:outcome_SOCTheory of mind (non-adjusted)                0.6412 
## percentage_ASD100:outcome_SOCTheory of mind (non-adjusted)              0.9275 
##                                                                          ci.ub 
## percentage_ASD0:outcome_SOCEveryday social skills (non-adjusted)        1.5206 
## percentage_ASD100:outcome_SOCEveryday social skills (non-adjusted)      2.5989 
## percentage_ASD0:outcome_SOCFacial emotion recognition (non-adjusted)    0.7723 
## percentage_ASD100:outcome_SOCFacial emotion recognition (non-adjusted)  0.8811 
## percentage_ASD0:outcome_SOCTheory of mind (non-adjusted)                1.0914 
## percentage_ASD100:outcome_SOCTheory of mind (non-adjusted)              1.4175 
##  
## percentage_ASD0:outcome_SOCEveryday social skills (non-adjusted)        *** 
## percentage_ASD100:outcome_SOCEveryday social skills (non-adjusted)      *** 
## percentage_ASD0:outcome_SOCFacial emotion recognition (non-adjusted)    *** 
## percentage_ASD100:outcome_SOCFacial emotion recognition (non-adjusted)  *** 
## percentage_ASD0:outcome_SOCTheory of mind (non-adjusted)                *** 
## percentage_ASD100:outcome_SOCTheory of mind (non-adjusted)              *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(SCE.S7_a_ph, L=c(-1,1,0,0,0,0))
## 
## Hypothesis:                                                                                                                                              
## 1: -percentage_ASD0:outcome_SOCEveryday social skills (non-adjusted) + percentage_ASD100:outcome_SOCEveryday social skills (non-adjusted) = 0 
## 
## Results:
##    estimate     se    zval   pval 
## 1:   1.0589 0.0499 21.2056 <.0001 
## 
## Test of Hypothesis:
## QM(df = 1) = 449.6769, p-val < .0001
anova(SCE.S7_a_ph, L=c(0,0,-1,1,0,0))
## 
## Hypothesis:                                                                                                                                                      
## 1: -percentage_ASD0:outcome_SOCFacial emotion recognition (non-adjusted) + percentage_ASD100:outcome_SOCFacial emotion recognition (non-adjusted) = 0 
## 
## Results:
##    estimate     se   zval   pval 
## 1:   0.0802 0.0594 1.3496 0.1771 
## 
## Test of Hypothesis:
## QM(df = 1) = 1.8214, p-val = 0.1771
anova(SCE.S7_a_ph, L=c(0,0,0,0,-1,1))
## 
## Hypothesis:                                                                                                                              
## 1: -percentage_ASD0:outcome_SOCTheory of mind (non-adjusted) + percentage_ASD100:outcome_SOCTheory of mind (non-adjusted) = 0 
## 
## Results:
##    estimate     se   zval   pval 
## 1:   0.3062 0.0520 5.8913 <.0001 
## 
## Test of Hypothesis:
## QM(df = 1) = 34.7080, p-val < .0001

b. ODD/CD

dat.meta.S7_b = subset(dat.meta, !is.na(percentage_CD_ODD) & outcome_SOC %in% unique(synth_n$outcome_SOC[synth_n$nstudy1 > 20]))
dat.meta.S7_b$percentage_CD_ODD = as.numeric(as.character(dat.meta.S7_b$percentage_CD_ODD))
V.SCE.S7_b  <- with(dat.meta.S7_b,
  clubSandwich::impute_covariance_matrix(
    vi = se^2, 
    cluster = ID_study, 
    r = 0.8,
    return_list = FALSE,
    smooth_vi = TRUE, 
    subgroup = outcome_SOC))


SCE.S7_b <- metafor::rma.mv(yi = es, V = V.SCE.S7_b, 
                          data = dat.meta.S7_b, 
                          mods = ~ percentage_CD_ODD * outcome_SOC,
                          random = ~ outcome_SOC | ID_study,
                          struct = "DIAG",
                          sparse = TRUE)
clubSandwich::coef_test(SCE.S7_b, vcov = "CR2", cluster = dat.meta.S7_b$ID_study)
##                                                                    Coef.
## 1                                                                intrcpt
## 2                                                      percentage_CD_ODD
## 3                   outcome_SOCFacial emotion recognition (non-adjusted)
## 4                               outcome_SOCTheory of mind (non-adjusted)
## 5 percentage_CD_ODD:outcome_SOCFacial emotion recognition (non-adjusted)
## 6             percentage_CD_ODD:outcome_SOCTheory of mind (non-adjusted)
##   Estimate      SE t-stat  d.f. p-val (Satt) Sig.
## 1  1.24727 0.12773   9.76 35.42       <0.001  ***
## 2  0.00381 0.00237   1.61  1.20       0.3232     
## 3 -0.57571 0.16752  -3.44 49.46       0.0012   **
## 4 -0.33306 0.16606  -2.01 48.44       0.0505    .
## 5 -0.00350 0.00282  -1.24  1.74       0.3552     
## 6 -0.00474 0.00255  -1.86  1.67       0.2289
anova(SCE.S7_b, btt=5:6)
## 
## Test of Moderators (coefficients 5:6):
## QM(df = 2) = 18.4270, p-val < .0001
SCE.S7_b_ph = metafor::rma.mv(yi = es, V = V.SCE.S7_b, 
                data = dat.meta.S7_b, 
                mods = ~ percentage_CD_ODD : outcome_SOC - 1,
                random = ~ outcome_SOC | ID_study,
                struct = "DIAG",
                sparse = TRUE)
clubSandwich::coef_test(SCE.S7_b_ph, vcov = "CR2", cluster = dat.meta.S7_b$ID_study)
##                                                                    Coef.
## 1     percentage_CD_ODD:outcome_SOCEveryday social skills (non-adjusted)
## 2 percentage_CD_ODD:outcome_SOCFacial emotion recognition (non-adjusted)
## 3             percentage_CD_ODD:outcome_SOCTheory of mind (non-adjusted)
##    Estimate      SE t-stat d.f. p-val (Satt) Sig.
## 1  0.004147 0.00196  2.113 1.14        0.257     
## 2  0.000415 0.00151  0.275 2.25        0.807     
## 3 -0.000527 0.00102 -0.514 1.26        0.683

9.10. Type of tools

dat.meta.S11 = subset(dat.meta, !is.na(Type_mesure) & outcome_SOC== "Theory of mind (non-adjusted)")
dat.meta.S11$vi = dat.meta.S11$se^2
dat.meta.S11$es_id = 1:nrow(dat.meta.S11)
SCE.S11 <- metafor::rma.mv(yi = es, V = vi, 
                          data = dat.meta.S11, 
                          mods = ~ Type_mesure ,
                          random = ~ 1 | ID_study/es_id)
clubSandwich::coef_test(SCE.S11, vcov = "CR2", cluster = dat.meta.S11$ID_study)
##               Coef. Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1           intrcpt    0.767 0.0744  10.31 43.20       <0.001  ***
## 2 Type_mesureReport    0.487 0.2379   2.05  7.77       0.0757    .
SCE.S11wi <- metafor::rma.mv(yi = es, V = vi, 
                          data = dat.meta.S11, 
                          mods = ~ Type_mesure - 1,
                          random = ~ 1 | ID_study/es_id)
clubSandwich::coef_test(SCE.S11wi, vcov = "CR2", cluster = dat.meta.S11$ID_study)
##                 Coef. Estimate     SE t-stat  d.f. p-val (Satt) Sig.
## 1 Type_mesureParadigm    0.767 0.0744   10.3 43.20       <0.001  ***
## 2   Type_mesureReport    1.254 0.2410    5.2  8.28       <0.001  ***